--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/message_handler.py fda9187e95d8b9cc8373c1de23cefce6928c241d (fda9187e) Text, 4.38 KB
Tff7b72from T7ee787.T7ee787database Tff7b72import Te6edf3Database
Tff7b72class T56d364MessageHandlerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dbTb4b4b4: Te6edf3DatabaseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdb Tff7b72= Te6edf3db
Tff7b72def Td2a8ffget_conversation_messagesTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3local_hashTb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3limitTff7b72=T79c0ff100Tb4b4b4,
Te6edf3offsetTff7b72=T79c0ff0Tb4b4b4,
Te6edf3after_idTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3before_idTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"""
Ta5d6ff SELECT * FROM lxmf_messages
Ta5d6ff WHERE peer_hash = ?
Ta5d6ff Ta5d6ff"""
Te6edf3params Tff7b72= Tb4b4b4[Te6edf3destination_hashTb4b4b4]
Tff7b72if Te6edf3after_idTb4b4b4:
Te6edf3query Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND id > ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3after_idTb4b4b4)
Tff7b72if Te6edf3before_idTb4b4b4:
Te6edf3query Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND id < ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3before_idTb4b4b4)
Te6edf3query Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff ORDER BY id DESC LIMIT ? OFFSET ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Te6edf3limitTb4b4b4, Te6edf3offsetTb4b4b4]Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3paramsTb4b4b4)
Tff7b72def Td2a8ffdelete_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3local_hashTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffDELETE FROM lxmf_messages WHERE peer_hash = ?Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffsearch_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3local_hashTb4b4b4, Te6edf3search_termTb4b4b4)Tb4b4b4:
Te6edf3like_term Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3search_termTffd700}Ta5d6ff%Ta5d6ff"
Te6edf3query Tff7b72= Ta5d6ff"""
Ta5d6ff SELECT peer_hash, MAX(timestamp) as max_ts
Ta5d6ff FROM lxmf_messages
Ta5d6ff WHERE title LIKE ? OR content LIKE ? OR peer_hash LIKE ?
Ta5d6ff GROUP BY peer_hash
Ta5d6ff Ta5d6ff"""
Te6edf3params Tff7b72= Tb4b4b4[Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4]
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3paramsTb4b4b4)
Tff7b72def Td2a8ffget_conversationsTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3local_hashTb4b4b4,
Te6edf3searchTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3filter_unreadTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3filter_failedTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3filter_has_attachmentsTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3limitTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3offsetTff7b72=T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e# Optimized using peer_hash column and JOINs to avoid N+1 queries
Te6edf3query Tff7b72= Ta5d6ff"""
Ta5d6ff SELECT
Ta5d6ff m1.*,
Ta5d6ff a.app_data as peer_app_data,
Ta5d6ff c.display_name as custom_display_name,
Ta5d6ff con.custom_image as contact_image,
Ta5d6ff i.icon_name, i.foreground_colour, i.background_colour,
Ta5d6ff r.last_read_at,
Ta5d6ff (SELECT COUNT(*) FROM lxmf_messages m_failed
Ta5d6ff WHERE m_failed.peer_hash = m1.peer_hash AND m_failed.state = Ta5d6ff'Ta5d6fffailedTa5d6ff'Ta5d6ff) as failed_count
Ta5d6ff FROM lxmf_messages m1
Ta5d6ff INNER JOIN (
Ta5d6ff SELECT peer_hash, MAX(timestamp) as max_ts
Ta5d6ff FROM lxmf_messages
Ta5d6ff WHERE peer_hash IS NOT NULL
Ta5d6ff GROUP BY peer_hash
Ta5d6ff ) m2 ON m1.peer_hash = m2.peer_hash AND m1.timestamp = m2.max_ts
Ta5d6ff LEFT JOIN announces a ON a.destination_hash = m1.peer_hash
Ta5d6ff LEFT JOIN custom_destination_display_names c ON c.destination_hash = m1.peer_hash
Ta5d6ff LEFT JOIN contacts con ON (
Ta5d6ff con.remote_identity_hash = m1.peer_hash OR
Ta5d6ff con.lxmf_address = m1.peer_hash OR
Ta5d6ff con.lxst_address = m1.peer_hash
Ta5d6ff )
Ta5d6ff LEFT JOIN lxmf_user_icons i ON i.destination_hash = m1.peer_hash
Ta5d6ff LEFT JOIN lxmf_conversation_read_state r ON r.destination_hash = m1.peer_hash
Ta5d6ff Ta5d6ff"""
Te6edf3params Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3where_clauses Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3filter_unreadTb4b4b4:
Te6edf3where_clausesTff7b72.Td2a8ffappendTb4b4b4(
Ta5d6ff"Ta5d6ff(r.last_read_at IS NULL OR m1.timestamp > strftime(Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, r.last_read_at))Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3filter_failedTb4b4b4:
Te6edf3where_clausesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffm1.state = Ta5d6ff'Ta5d6fffailedTa5d6ff'Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3filter_has_attachmentsTb4b4b4:
Te6edf3where_clausesTff7b72.Td2a8ffappendTb4b4b4(
Ta5d6ff"Ta5d6ff(m1.fields IS NOT NULL AND m1.fields != Ta5d6ff'Tffd700{}Ta5d6ff'Ta5d6ff AND m1.fields != Ta5d6ff'Ta5d6ff'Ta5d6ff)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3searchTb4b4b4:
Te6edf3like_term Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"
T8b949e# Search in latest message info OR search across ALL messages for this peer
Te6edf3where_clausesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"""
Ta5d6ff (m1.title LIKE ? OR m1.content LIKE ? OR m1.peer_hash LIKE ? OR c.display_name LIKE ?
Ta5d6ff OR m1.peer_hash IN (SELECT peer_hash FROM lxmf_messages WHERE title LIKE ? OR content LIKE ?))
Ta5d6ff Ta5d6ff"""Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(
Tb4b4b4[Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3where_clausesTb4b4b4:
Te6edf3query Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff WHERE Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff AND Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3where_clausesTb4b4b4)
Te6edf3query Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff GROUP BY m1.peer_hash ORDER BY m1.timestamp DESCTa5d6ff"
Tff7b72if Te6edf3limit Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3query Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff LIMIT ? OFFSET ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Te6edf3limitTb4b4b4, Te6edf3offsetTb4b4b4]Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3paramsTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────